Réplication de données sur 2 serveurs avec clustering et balancement de services sous Debian

 

 

Lorsque l'on héberge des données sur un serveur et/ou que l'on propose des services hébergés sur un ou plusieurs serveurs, il est important que ces données et/ou services puissent être disponibles, et ce même en cas de plantage d'un serveur.
Pour éviter que le service ou les données importantes ne deviennent inaccessibles, on met souvent en place de la haute disponibilité.

Dans le cas d'un serveur sous Linux, nous pouvons fournir de la haute disponibilité pour quasiment n'importe quel service (web, FTP, NFS, iSCSI, ...) grâce à DRBD et Heartbeat.

Notez que Heartbeat est limité à 2 serveurs. Pour créer un cluster de plus de 2 serveurs, vous devrez utiliser Pacemaker.
Mais, gardez à l'esprit que Heartbeat est très utilisé pour ses performances, sa souplesse et sa stabilité.

 

Sommaire

Réplication de données sur 2 serveurs avec clustering et balancement de services sous Debian

1. Qu'est-ce que DRBD

2. Qu'est-ce que Heartbeat

3. Configuration utilisée

4. DRBD (Réplication des données)

4.1. Installation

4.2. Configuration des ressources

4.3. Activation de la réplication des données

4.4. Création du système de fichier sur le disque de DRBD

5. Heartbeat (Cluster et balancement de services)

5.1. Installation

5.2. Configuration

5.3. Démarrage de HeartBeat

6. Test du cluster

 

1. Qu'est-ce que DRBD

DRBD signifie Distributed Replicated Block Device et permet de créer une sorte de RAID 1 via le réseau.
C'est donc DRBD qui nous permettra de créer une copie en temps réel d'un disque dur, d'une
partition ou d'un système LVM, sur un autre serveur.
Cette synchronisation sera effectuée en temps réel via le réseau et c'est la raison pour laquelle il est recommandé (mais pas obligatoire) d'utiliser un réseau dédié entre les 2 serveurs concernés (le serveur principal et celui de secours).

Grâce à DRBD, nos données seront accessibles depuis 2 serveurs. Si un serveur est défaillant, les données seront toujours accessibles depuis l'autre serveur.
Néanmoins, il manque quelque chose pour que le service soit toujours accessible par vos utilisateurs.
C'est ce que nous allons voir à l'étape suivante. (Heartbeat)

2. Qu'est-ce que Heartbeat

Heartbeat est un programme qui permet de surveiller la disponibilité d'un serveur et lorsque l'un d'entre eux est défaillant, les services sont automatiquement basculés sur l'autre serveur.
Pour effectuer cette vérification, les 2 serveurs se contacteront via le réseau à intervalle régulier.

En résumé, si le serveur 1 est défaillant, l'utilisateur pourra toujours accéder aux mêmes services via le serveur 2.
De plus, pour que cela soit transparent pour vos utilisateurs, vous devrez définir une adresse IP virtuelle via Heartbeat.

Pour finir, sachez qu'il fortement recommandé d'utiliser au moins 2 chemins différents pour vérifier qu'un autre serveur est toujours disponible.
Cela permet d'être sûr que le serveur est défaillant.
En effet, si une carte réseau est défaillante, heartbeat connaitra toujours l'état du serveur via l'autre
carte réseau. Dans le cas contraire, Heartbeat aurait considéré à tort que l'autre serveur était défaillant.

3. Configuration utilisée

2 serveurs Debian 7.7.0 x64 avec :
- 2 disques durs chacun (1 pour Debian et l'autre pour les données à répliquer)
- 2 cartes réseaux chacun (1 pour l'accès depuis l'extérieur et l'autre dédiée à la réplication des données)

Comme indiqué précédemment, l'utilisation de 2 cartes réseau permettra d'avoir :
- une carte réseau pour l'accès depuis l'extérieur effectué par vos utilisateurs
- un réseau dédié pour la réplication des données. La réplication sera donc plus rapide et n'affectera pas les performances réseau pour les accès utilisateurs.
Pour relier vos 2 serveurs entre eux, vous pouvez utiliser un routeur, un switch ou même un câble croisé (branché directement sur les 2 cartes réseau eth1 (voir ci-dessous) de chacun de vos serveurs).

Dans notre cas, ces 2 serveurs auront donc 2 interfaces réseau :
- eth0 : 10.0.0.31 pour le serveur 1 et 10.0.0.32 pour le serveur 2. Il s'agit de la carte réseau connectée au routeur via lequel les utilisateurs accéderont à nos services (serveur web, ...)
- eth1 : 192.168.1.31 pour le serveur 1 et 192.168.1.32 pour le serveur 2. Il s'agit de la carte réseau connectée sur un autre routeur ou sur un switch (étant donné que les serveurs auront des IP fixes, le serveur DHCP sera inutile dans ce cas-ci)

Pour définir les adresses IP sur vos serveurs Linux, référez-vous à nos tutoriels : Debian - Définir une adresse IP privée statique ou Ubuntu - Définir une adresse IP privée statique.
Note : si vous ne possédez pas de passerelle pour l'interface eth1, il suffit de ne pas indiquer la ligne "gateway" pour cette interface dans le fichier "/etc/network/interfaces".

Dans notre cas, nous avons donc un réseau dédié entre nos 2 serveurs via le switch et les interfaces eth1 de nos 2 serveurs.

4. DRBD (Réplication des données)

IMPORTANT : les commandes indiquées devront toujours être exécutées sur vos 2 serveurs (sauf mention contraire), et ce simultanément (sinon, vous risque d'obtenir des messages d'erreur).

4.1. Installation

Avant de commencer, nous allons créer une partition sur le 2ème disque dur (sdb) de chaque serveur.
Pour cela, tapez ceci sur les 2 serveurs :

fdisk /dev/sdb

Pour créer une partition sur tout le disque dur, tapez "n" (nouvelle partition), puis "p" (primaire), puis laissez les valeurs par défaut pour le reste.
Lorsqu'il vous demande à nouveau une commande, tapez "w" (écrire la table de partitions).

Si vous souhaitez partitionner votre disque dur autrement, référez-vous à notre tutoriel : Partitionner son disque dur avec fdisk

Pour installer DRBD, il suffit d'installer le paquet "drbd8-utils" sur les 2 serveurs.

apt-get install drbd8-utils

Une fois installé, activez le module "drbd".

modprobe drbd

Note : pour obtenir des infos concernant la version de DRBD, utilisez cette commande :

modinfo drbd

4.2. Configuration des ressources

Comme indiqué dans la documentation officielle, les ressources doivent être définies dans des fichiers "*.res".

Dans notre cas, nous allons donc créer un fichier "drbd0.res".
Note : ce fichier doit être identique sur les 2 serveurs.

vi /etc/drbd.d/drbd0.res

Dans ce nouveau fichier, nous allons coller ceci.
Notez que :
- iw0 est le nom de la ressource dont on aura besoin plus tard pour gérer cette ressource.
- server1 et server2 correspondent aux noms (hostname) de nos 2 serveurs Debian.
- 192.168.1.31 et 192.168.1.32 correspondent aux adresses IP de nos 2 serveurs Debian sur le réseau dédié (le switch).
- "device /dev/drbd0" correspond au "disque" fourni par DRBD
- "disk /dev/sdb1;" la partition 1 (sdb1) de notre disque dur "sdb".
- "syncer" permet de limiter la vitesse de synchronisation entre les 2 serveurs. (facultatif)

resource iw0 {

    startup {

        wfc-timeout 30;

        degr-wfc-timeout 15;

    }

     

    disk {

        on-io-error   detach;

    }

     

   # Taux de transfert

    # 10M pour du 100mbits

    # 100M pour du 1Gbits

    syncer {

        rate 100M;

    }

     

    on server1 {

        device /dev/drbd0;

        disk /dev/sdb1;

        address 192.168.1.31:7788;

        meta-disk internal;

    }

    on server2 {

        device /dev/drbd0;

        disk /dev/sdb1;

        address 192.168.1.32:7788;

        meta-disk internal;

    }

}

Sur les 2 serveurs, vérifiez et modifiez si nécessaire le nom de votre serveur en modifiant les fichiers :
- "/etc/hostname" : contient uniquement le nom de votre serveur Linux
- "/etc/hosts" : contient les correspondances entre le nom de votre serveur Linux et son adresse IP.

vi /etc/hostname

Note : si vous modifiez le nom de votre serveur Linux, il est préférable de le redémarrer complètement.

Pour éviter les problèmes, ajoutez ceci dans le fichier "/etc/hosts" de vos 2 serveurs.

vi /etc/hosts

192.168.1.31    server1

192.168.1.32    server2

4.3. Activation de la réplication des données

Pour activer la réplication des données, utiliser ces commandes.
Note : iw0 correspond au nom de la ressource que nous venons de définir dans le fichier "drbd0.res".

drbdadm create-md iw0

drbdadm up iw0

Si vous utilisez la commande "drbd-overview", vous devriez voir que vos 2 serveurs sont actuellement connectés et qu'ils sont tous les 2 en "secondaire".
Du coup, la réplication ne s'effectue pas étant donné que DRBD ne sait pas dans quel sens il doit synchroniser les données.

Drbd-overview

0:iw0  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----

Pour régler le problème, tapez cette commande sur le serveur 1 (uniquement) :

drbdadm -- --overwrite-data-of-peer primary iw0

Maintenant, DRBD sait que le serveur 1 est le serveur principal et que l'autre est le serveur secondaire (celui qui sera utilisé en cas de défaillance du serveur principal).
Note : si vous avez besoin de repasser le serveur maitre en secondaire, voici la commande à utiliser :

drbdadm secondary r0

Si vous tapez la commande "drbd-overview", vous verrez que DRBD commence la réplication des données du serveur principal (Primary) vers le serveur secondaire (Secondary).
Ceci peut prendre du temps en fonction de l'utilisation de votre réseau et de la taille du "disque" à répliquer.

Drbd-overview

0:iw0  SyncSource Primary/Secondary UpToDate/Inconsistent C r-----

  [>....................] sync'ed:  0.2% (81760/81916)Mfinish: 0:08:53 speed: 156,416 (156,416) K/sec

Pour vérifier l'état de la synchronisation, vous pouvez aussi utiliser la commande :

cat /proc/drbd

Ou cette commande pour voir l'avancement en live.
Note : appuyez sur CTRL + C pour quitter le programme "watch".

watch cat /proc/drbd

4.4. Création du système de fichier sur le disque de DRBD

Pour pouvoir stocker des données sur la partition répliquée par DRBD, vous devrez y créer un système de fichiers.
Pour cela, utilisez la commande :

mkfs.ext4 /dev/drbd0

Si vous recevez cette erreur, c'est que votre serveur principal n'est pas en "Primary" ou que vous tentez de créer le système de fichiers sur le disque
"/dev/drbd0" du serveur secondaire.

mke2fs 1.42.5 (29-Jul-2012)

mkfs.ext4: Mauvais type de medium lors de la tentative de détermination de la taille du système de fichiers

Pour régler ce problème, tapez cette commande sur votre serveur principal.

drbdadm -- --overwrite-data-of-peer primary iw0

Maintenant, nos données seront toujours disponibles depuis 2 serveurs.
Il ne reste qu'à créer un cluster avec ces 2 serveurs pour que nos services soient accessibles via une IP unique et que les services soient toujours disponibles, même si un des 2 serveurs tombe en panne.

5. Heartbeat (Cluster et balancement de services)

5.1. Installation

Pour installer Heartbeat, il suffit d'installer le paquet "heartbeat".

IMPORTANT : Comme pour DRBD, les commandes proposées et les fichiers à créer devront être exécutées et créés sur les 2 serveurs (sauf mention contraire).

apt-get install heartbeat

5.2. Configuration

Pour configurer Heartbeat, vous devrez créer 3 fichiers dans le dossier "/etc/ha.d/" :
- ha.cf : fichier de configuration de heartbeat
- haresources : fichier de configuration pour les ressources
- authkeys : fichier contenant une clé qui permettra aux serveurs de s'identifier l'un l'autre.

Pour commencer, créez le fichier "ha.cf" et collez ceci à l'intérieur.

vi /etc/ha.d/ha.cf

 

# 2 chemins différents (eth0 et eth1) pour permettre

# à HeartBeat de savoir si l'autre serveur est toujours accessible.

# - mcast eth0 : IP multicast utilisée via l'interface réseau : eth0

# - bcast eth1 : paquets de broadcast envoyés sur l'interface eth1 (il est préférable d'y indiquer une interface réseau réservée à Heartbeat, et DRBD si vous le souhaitez)

mcast eth0 239.0.0.20 694 1 0

bcast eth1

 

# Délai à partir duquel HeartBeat considérera l'autre serveur comme défaillant

# Fréquence à laquelle HeartBeat enverra son paquet "keepalive" à l'autre serveur

# Etc.

warntime 4

deadtime 5

initdead 15

keepalive 2

 

# Lorsque le serveur principal redevient disponible, HeartBeat repassera ce serveur en "Primary"

# si vous activez cette option (auto_failback on).

# Néanmoins, pour éviter de provoquer 2 interruptions de services (lorsque le serveur principal

# tombe en panne, puis quand il redevient disponible), nous vous recommandons de

# désactiver cette option (auto_failback off).

auto_failback off

 

# Liste des serveurs du cluster

node server1

node server2

 

Pour plus d'infos sur le fichier "ha.cf", consultez la documentation officielle de DRBD.

Ensuite, créez le fichier "haresources".

vi /etc/ha.d/haresources

Et collez ceci :

server1 IPaddr::10.0.0.30/24/eth0 drbddisk::iw0 Filesystem::/dev/drbd0::/mnt::ext4

Infos :
- server1 : nom du serveur primaire
- 10.0.0.30 : IP virtuel à laquelle vos utilisateurs accéderont pour accéder au serveur actif (le serveur 1 ou le serveur 2 si le serveur 1 est défaillant)
- eth0 : spécifie l'interface réseau à utiliser.
- iw0 : nom de la ressource que nous avions indiqué dans le fichier : /etc/drbd.d/drbd0.res
- Filesystem::/dev/drbd0::/mnt::ext4 : la partition fournie par DRBD, son point de montage et le système de fichiers utilisés sur cette partition.

Et enfin, créez le fichier "authkeys" qui contiendra une clé (un mot de passe) partagée entre les 2 serveurs.
Note : vous pouvez remplacer "my-private-key" par ce que vous voulez, mais cette valeur devra être identique sur les 2 serveurs.

vi /etc/ha.d/authkeys

auth 1

1 md5 my-private-key

Changer les permissions de ce fichier :

chmod 600 /etc/ha.d/authkeys

5.3. Démarrage de HeartBeat

Pour commencer, vérifiez que la partition "/dev/drbd0" n'est pas montée.
Pour cela, tapez cette commande :

df -h

Comme vous pouvez le voir, la partition "/dev/drbd0" n'apparait pas dans la liste.

 

Sys. fich.                                             Taille Util. Dispo Uti% Monté sur

rootfs                                                    57G  4,9G   49G  10% /

udev                                                      10M     0   10M   0% /dev

tmpfs                                                    396M  644K  395M   1% /run

/dev/disk/by-uuid/3f7e5d0d-62e7-4ec9-a36b-a9f0983644c8    57G  4,9G   49G  10% /

tmpfs                                                    5,0M  4,0K  5,0M   1% /run/lock

tmpfs                                                    1,3G  224K  1,3G   1% /run/shm

 

Démarrez HeartBeat sur le serveur principal (dans notre cas : server1).

/etc/init.d/heartbeat start

Lors du démarrage de HeartBeat, vous verrez ceci.
C'est tout à fait normal. Il ne s'agit pas d'une erreur, mais d'une information (INFO).

Starting High-Availability services: IPaddr[6171]: INFO:  Resource is stopped

Done.

Attendez pendant quelques secondes et tapez à nouveau la commande :

df -h

Vous devriez voir apparaitre la partition "/dev/drbd0" montée sur "/mnt".
Si ce n'est pas le cas, attendez encore 1 minute et tapez à nouveau la commande "df -h".
Si la partition n'apparait toujours pas, vérifiez que votre configuration est correcte (configuration de DRBD, de HeartBeat, et de vos interfaces réseau).

 

Sys. fich.                                             Taille Util. Dispo Uti% Monté sur

rootfs                                                    57G  4,9G   49G  10% /

udev                                                      10M     0   10M   0% /dev

tmpfs                                                    396M  648K  395M   1% /run

/dev/disk/by-uuid/3f7e5d0d-62e7-4ec9-a36b-a9f0983644c8    57G  4,9G   49G  10% /

tmpfs                                                    5,0M  4,0K  5,0M   1% /run/lock

tmpfs                                                    1,3G  372K  1,3G   1% /run/shm

/dev/drbd0                                                79G  184M   75G   1% /mnt

 

Si la partition "/dev/drbd0" apparait, alors vous pourrez aussi lancer HeartBeat sur le serveur secondaire ("server2" dans notre cas).

Notez qu'une interface "eth0:0" devrait aussi apparaitre si vous tapez la commande :

ifconfig

...

eth0:0    Link encap:Ethernet  HWaddr 00:0c:29:49:00:aa

inet adr:10.0.0.30  Bcast:10.0.0.255  Masque:255.255.255.0

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

...

Sur le serveur secondaire, tapez la commande :

/etc/init.d/heartbeat start

Notez que la partition ne sera pas montée sur le serveur secondaire tant que le serveur principal sera disponible (non défaillant).

6. Test du cluster

Pour le moment, si vous tapez la commande "drbd-overview" sur le serveur 1, vous verrez qu'il s'agit du serveur principal (Primary) et que la partition de DRBD est bien montée sur "/mnt".

Drbd-overview

0:iw0  Connected Primary/Secondary UpToDate/UpToDate C r----- /mnt ext4 79G 184M 75G 1%

Si vous tapez la commande "watch drbd-overview" sur le serveur 2, vous verrez qu'il s'agit du serveur secondaire et que la partition n'est pas montée pour le moment.
Pour que celle-ci soit montée sur ce serveur, il faut que le serveur principal soit en panne.
Note : la commande ci-dessous actualise son affichage toutes les 2 secondes.

watch drbd-overview

Every 2,0s: drbd-overview                               Thu Oct 13 21:32:27 2016

 

  0:iw0  Connected Secondary/Primary UpToDate/UpToDate C r-----

Pour simuler cette panne, il suffit d'arrêter HeartBeat sur le serveur principal.

/etc/init.d/heartbeat stop

Du coup, vous verrez que le serveur 2 vous affichera ceci.
Ce qui veut dire que HeartBeat vient de passer votre serveur secondaire en principal.
Et comme vous pouvez le voir, HeartBeat a bien monté la partition sur le serveur secondaire, car le serveur principal est "défaillant".

 

Every 2,0s: drbd-overview                               Thu Oct 13 21:34:06 2016

 

  0:iw0  Connected Primary/Secondary UpToDate/UpToDate C r----- /mnt ext4 79G 184M 75G 1%

Si vous relancez HeartBeat sur le serveur 1 (qui était le serveur principal), HeartBeat basculera à nouveau vos services sur le serveur 1 (si l'option "auto_failback on" est présente dans le fichier "/etc/ha.d/ha.cf").

Note : appuyez sur CTRL + C pour quitter la commande "watch drbd-overview".